
\documentclass{article}


\usepackage[frenchb]{babel}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{graphicx}
\usepackage{listings}
\usepackage{setspace}
\usepackage{fancyhdr}
\usepackage{multicol}
\usepackage{verbatim}
\usepackage{amsfonts}
\usepackage{color}

\definecolor{jbackground}{rgb}{0.9,0.9,0.9}
\lstset{language=C, backgroundcolor=\color{jbackground}}

%%%%%%%%%%%%%%%% Lengths %%%%%%%%%%%%%%%%
\setlength{\textwidth}{15.5cm}
\setlength{\evensidemargin}{0.5cm}
\setlength{\oddsidemargin}{0.5cm}

%%%%%%%%%%%%%%%% Variables %%%%%%%%%%%%%%%%

\def\projet{S8 - Système d'exploitation}
\def\titre{Ecriture d’une bibliothèque de threads en espace utilisateur}
\def\groupe{1}
%\def\equipe{GC.finalize()}
\def\responsible{Martin-Guillerez Damien}
\def\others{Abdessamad HAILASS, Charaf-Eddine SHITIT\\  Mohamed Ayoub GHARSSALLI, Meryem Kesmi \\ Bastien Stefani}

\begin{document}
\begin{center}

\includegraphics[scale=0.5]{logo.jpg} 

\end{center}
%%%%%%%%%%%%%%%% Header %%%%%%%%%%%%%%%%
\noindent\begin{minipage}{0.98\textwidth}
  \vskip 0mm
  \noindent
  { \begin{tabular}{p{7.5cm}}
      {\bfseries \sffamily
        Projet \projet} \\ 
      {\itshape \titre}
    \end{tabular}}
  \hfill 
  \fbox{\begin{tabular}{l}
      {~\hfill \bfseries \sffamily Groupe \groupe\ 
        \hfill~} \\[2mm] 
      \textbf{Encadrant} : \responsible \\
      \textbf{Equipe} : \others
    \end{tabular}}
  \vskip 10mm ~

  ~~~\parbox{0.95\textwidth}{\small \textit{Introduction~:} \sffamily Le projet de système d'exploitation consiste à réaliser une bibliothèque de threads en espace utilisateur à l'aide du langage \textbf{C}. Pour réaliser notre bibliothèque, nous avons utilisé l'interface de programmation \texttt{ucontext} qui permet de manipuler des contextes de threads et ce  en espace utilisateur. Cette bibliothèqe de threads doit satisfaire les critères suivants :
\begin{itemize}
\item Les coûts d'ordonnancement sont beaucoup plus faibles
\item Les politiques d'ordonnancement sont configurables
\item Pouvoir expérimenter réellement le changement de contexte
\end{itemize}
Dans ce rapport, nous allons commencer par la description du travail réalisé: le choix des structures mises en place, ensuite nous allons nous intéresser à l'implémentation de l'interface de gestion de threads et enfin nous montrerons les objectifs visées au futur.}
  \vskip 10mm ~
\end{minipage}


%%%%%%%%%%%%%%%% Main part %%%%%%%%%%%%%%%%
\newpage
\section{Travail accompli}
Dans cette partie, nous allons présenter et expliquer les structures réalisées nécessaires à la construction de la bibliothèque de gestion de threads. Ensuite, nous allons nous intéresser à l'implémentation de cette interface de threads qui permet de créer, détruire, passer la main (éventuellement à un thread particulier), attendre la/une terminaison ... .


\subsection{La structure des threads}

Pour représenter un thread en mémoire, nous avons défini la structure suivante : 
\begin{lstlisting}
struct thread {
   thread_status status;
   ucontext_t context;
   struct timeval * execution_time;
   unsigned int thread_id;
   void * retval;
};
\end{lstlisting}

Cette structure regroupe les champs : 
\begin{itemize}
\item \textbf{status} : l'état ou le status d'un thread. Nous avons utilisé une énumération des états d'un thread (enum{ENDED, SLEEPING,RUNNING })
\item \textbf{context} : le contexte d'exécution du thread
\item \textbf{execution\_time} : le temps d'exécution d'un thread
\item \textbf{thread\_id} : l'identifiant de thread
\item \textbf{retval} : la valeur de retour d'un thread (accessible uniquement une fois que le thread ait fini de s'exécuter)
\end{itemize}


\subsection{La structure d'organisation des threads}

Nos threads seront stockés sur trois structures appelées \textbf{runq}, \textbf{sleepq} et \textbf{deadq}. Ces structures étaient dans un premier temps implémentées grâce à une file FIFO. Ensuite dans un soucis de performance d'insertion et de recherche nous avons opté pour une liste doublement chainée. Ce TAD est actuellement en modification en vue de le rendre la liste circulaire. Ceci permettra d'accélérer le passage d'un thread à un autre.

\subsubsection{La runq}

Elle rassemble tout les threads créés et prêts à s'exécuter. A chaque changement de contexte d'exécution, le thread courant et mis dans cette liste et est remplacé par le suivant dans cette liste, en tant que thread courant. Cette liste contiendra donc aussi le main qui est le premier à y être ajouté.

\subsubsection{La sleepq}

Elle contiendra les thread bloqués. Elle ne sera implémentée que dans le cas de l'ajout de l'option de gestion des appels systèmes bloquants.

\subsubsection{La deadq}

Elle contient les valeurs de retour des threads ayant fini leur exécution. Elle est consultée par les threads qui voudront récupérer ces valeurs. Nous avons fait le choix que ce thread videra l'entrée correspondante à celui qu'il attend.
\subsection*{Implémentation de l'interface de gestion de threads}

\subsubsection*{fonctions de la bibliothèque}


\section{Options avancées}





\end{document}
